package douaPahare.guiObject;

import java.util.ArrayList;
import java.util.Stack;

import javax.swing.JButton;

import douaPahare.algotihm.Algorithm;
import douaPahare.algotihm.BSF;
import douaPahare.algotihm.DSF;
import douaPahare.algotihm.DSFLimited;
import douaPahare.container.Actiune;
import douaPahare.container.Stare;
import douaPahare.operator.Operator;

public class Play extends JButton {
	
	private Algorithm alg;
	
	public Play(String nume) {
		super(nume);
		alg = null;
	}
	
	public void playBSF() {
		alg = new BSF();
		alg.solve();
		final Stack <Actiune> stiva = ((BSF)alg).findPath();
		System.out.println("incepe animatia:");
		Stare.printStareStatic();
		Thread t =
		new Thread(new Runnable() {
			public void run() {
				try {
					Actiune actiune;
					while(!stiva.empty()) {
						actiune = stiva.pop();
						actiune.getOperator().executa();
						((JButton)(actiune.getOperator())).setEnabled(false);
						Stare.printStareStatic();
						Thread.sleep(2500);
						((JButton)(actiune.getOperator())).setEnabled(true);
					}
				} catch(Exception ex) {
			}
		}
		});
		t.start();
	}
	
	public void playDSF() throws Exception {
		alg = new DSF();	
		alg.solve();
		final ArrayList<Actiune> path = ((DSF)alg).getPath();
		if(path.isEmpty())
			throw new Exception("Nu a fost gasita o solutie pentru algotritmul DSF");
		System.out.println("incepe animatia:");
		Stare.printStareStatic();
		Thread t =
		new Thread(new Runnable() {
			public void run() {
				try {
					for(Actiune actiune : path) {
						actiune.getOperator().executa();
						((JButton)(actiune.getOperator())).setEnabled(false);
						Stare.printStareStatic();
						Thread.sleep(2500);
						((JButton)(actiune.getOperator())).setEnabled(true);
					}
				} catch(Exception ex) {
			}
		}
		});
		t.start();
	}
	
	public void playDSFLimited() throws Exception {
		alg = new DSFLimited(6);	
		alg.solve();
		final ArrayList<Actiune> path = ((DSFLimited)alg).getPath();
		if(path.isEmpty())
			throw new Exception("Nu a fost gasita o solutie pentru algotritmul DSF");
		System.out.println("incepe animatia:");
		Stare.printStareStatic();
		Thread t =
		new Thread(new Runnable() {
			public void run() {
				try {
					for(Actiune actiune : path) {
						actiune.getOperator().executa();
						((JButton)(actiune.getOperator())).setEnabled(false);
						Stare.printStareStatic();
						Thread.sleep(2500);
						((JButton)(actiune.getOperator())).setEnabled(true);
					}
				} catch(Exception ex) {
			}
		}
		});
		t.start();
	}

	public void playDSFIterativ() throws Exception {
		for(int i=0;i<=10;i++) {
			alg = new DSFLimited(i);	
			alg.solve();
		}
		final ArrayList<Actiune> path = ((DSFLimited)alg).getPath();
		if(path.isEmpty())
			throw new Exception("Nu a fost gasita o solutie pentru algotritmul DSF");
		System.out.println("incepe animatia:");
		Stare.printStareStatic();
		Thread t =
		new Thread(new Runnable() {
			public void run() {
				try {
					for(Actiune actiune : path) {
						actiune.getOperator().executa();
						((JButton)(actiune.getOperator())).setEnabled(false);
						Stare.printStareStatic();
						Thread.sleep(2500);
						((JButton)(actiune.getOperator())).setEnabled(true);
					}
					System.out.println("end animation:");
				} catch(Exception ex) {
			}
		}
		});
		t.start();	
	}
	
	public void resetPahare(Operator o1,Operator o2) {
		try {
			if(Stare.getStareStatic().getX() != 0) {
				o1.executa();
				Stare.printStareStatic();
			}
			if(Stare.getStareStatic().getY() != 0) {
				o2.executa();
				Stare.printStareStatic();
			}
		} catch(Exception ex) {
			ex.printStackTrace();
		}
	}
	
	

}
